// pages/reminder/reminder.js
const app = getApp()

Page({

  /**
   * 页面的初始数据
   */
  data: {
    activeTab: 'scan',
    expiryStats: {
      sevenDays: 0,
      thirtyDays: 0,
      expired: 0
    },
    formData: {
      foodName: '',
      productionDate: new Date().getTime(),
      expiryPeriod: {
        value: 1,
        unit: 'day'
      },
      expiryDate: null
    },
    scanResult: null,
    foodList: [],
    minDate: new Date(2000, 0, 1).getTime(),
    maxDate: new Date().getTime(),
    unitOptions: [
      { text: '天', value: 'day' },
      { text: '月', value: 'month' }
    ],
    isSelectMode: false,
    selectedCount: 0,
    showAddForm: false
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.loadFoodList()
    this.drawProgressCircle()
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    this.checkExpired()
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    this.loadFoodList().then(() => {
      wx.stopPullDownRefresh()
    })
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  },

  // 切换顶部Tab
  switchTab(e) {
    const tab = e.currentTarget.dataset.tab
    this.setData({ activeTab: tab })
  },

  // 扫码处理
  async onScanCode() {
    try {
      const { result } = await wx.scanCode({
        scanType: ['barCode']
      })
      
      // 查询商品信息
      const db = wx.cloud.database()
      const { data } = await db.collection('products')
        .where({
          barcode: result
        })
        .get()

      if (data.length > 0) {
        const product = data[0]
        this.setData({
          scanResult: result,
          'formData.foodName': product.name,
          'formData.expiryPeriod': product.defaultExpiryPeriod
        })
      } else {
        wx.showToast({
          title: '未找到商品信息',
          icon: 'error'
        })
      }
    } catch (err) {
      console.error('扫码失败', err)
    }
  },

  // 模糊搜索商品
  async onSearchFood(e) {
    const keyword = e.detail
    if (keyword.length < 2) return

    try {
      const { result } = await wx.cloud.callFunction({
        name: 'searchFoods',
        data: { keyword }
      })

      if (result.data.length > 0) {
        // 显示搜索结果列表
        // TODO: 实现搜索结果的展示和选择逻辑
      }
    } catch (err) {
      console.error('搜索失败', err)
    }
  },

  // 生产日期选择处理
  onDateConfirm(e) {
    this.setData({
      'formData.productionDate': e.detail
    }, () => {
      this.calculateExpiryDate() // 自动计算过期时间
    })
  },

  // 保质期数值变化处理
  onPeriodValueChange(e) {
    this.setData({
      'formData.expiryPeriod.value': e.detail
    }, () => {
      this.calculateExpiryDate() // 自动计算过期时间
    })
  },

  // 保质期单位切换处理
  onPeriodUnitChange(e) {
    this.setData({
      'formData.expiryPeriod.unit': e.detail
    }, () => {
      this.calculateExpiryDate() // 自动计算过期时间
    })
  },

  // 计算过期时间
  calculateExpiryDate() {
    const { productionDate, expiryPeriod } = this.data.formData
    if (!productionDate || !expiryPeriod.value) return

    const date = new Date(productionDate)
    const value = Number(expiryPeriod.value)

    if (expiryPeriod.unit === 'day') {
      date.setDate(date.getDate() + value)
    } else if (expiryPeriod.unit === 'month') {
      date.setMonth(date.getMonth() + value)
    }

    this.setData({
      'formData.expiryDate': date.getTime()
    })

    // 更新预览文本
    const expiryDateText = this.formatDate(date)
    wx.showToast({
      title: `将于 ${expiryDateText} 过期`,
      icon: 'none',
      duration: 2000
    })
  },

  // 加载统计数据
  async loadStats() {
    try {
      const { result } = await wx.cloud.callFunction({
        name: 'getFoodStats'
      })

      if (result) {
        // 更新统计数据
        this.setData({
          expiryStats: result.stats
        })
        // 绘制进度圆环
        this.drawProgressCircle(result.stats)
      }
    } catch (err) {
      console.error('加载统计数据失败', err)
    }
  },

  // 绘制进度圆环
  drawProgressCircle(stats) {
    const ctx = wx.createCanvasContext('progressCanvas')
    const centerX = 150 // canvas宽度的一半
    const centerY = 150 // canvas高度的一半
    const radius = 120 // 圆环半径

    // 计算总数和比例
    const total = stats.sevenDays + stats.thirtyDays + stats.expired
    const sevenDaysRatio = stats.sevenDays / total
    
    // 绘制背景圆环
    ctx.beginPath()
    ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI)
    ctx.setLineWidth(15)
    ctx.setStrokeStyle('#f5f5f5')
    ctx.stroke()

    // 绘制进度圆环
    ctx.beginPath()
    ctx.arc(centerX, centerY, radius, -Math.PI / 2, -Math.PI / 2 + 2 * Math.PI * sevenDaysRatio)
    ctx.setLineWidth(15)
    ctx.setStrokeStyle('#1296db')
    ctx.stroke()

    ctx.draw()
  },

  // 获取食品项样式类
  getFoodClass(item) {
    if (item.remainDays < 0) return 'expired'
    if (item.remainDays <= 3) return 'urgent'
    if (item.remainDays <= 7) return 'warning'
    return ''
  },

  // 格式化日期
  formatDate(date) {
    date = new Date(date)
    return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`
  },

  // 选中/取消选中项目
  onCheckItem(e) {
    const { id } = e.currentTarget.dataset
    const index = this.getFoodIndex(id)
    const checked = !this.data.foodList[index].checked
    
    this.setData({
      [`foodList[${index}].checked`]: checked,
      selectedCount: this.data.selectedCount + (checked ? 1 : -1)
    })
  },

  // 删除选中项目
  async onDelete() {
    const selectedIds = this.data.foodList
      .filter(item => item.checked)
      .map(item => item._id)

    if (selectedIds.length === 0) {
      wx.showToast({
        title: '请选择要删除的项目',
        icon: 'none'
      })
      return
    }

    const db = wx.cloud.database()
    try {
      await db.collection('food_reminders')
        .where({
          _id: db.command.in(selectedIds)
        })
        .remove()

      wx.showToast({
        title: '删除成功',
        icon: 'success'
      })

      this.loadFoodList()
    } catch (err) {
      console.error('删除失败', err)
    }
  },

  // 标记完成
  async onMarkComplete() {
    const selectedIds = this.data.foodList
      .filter(item => item.checked)
      .map(item => item._id)

    if (selectedIds.length === 0) {
      wx.showToast({
        title: '请选择要标记的项目',
        icon: 'none'
      })
      return
    }

    const db = wx.cloud.database()
    try {
      await db.collection('food_reminders')
        .where({
          _id: db.command.in(selectedIds)
        })
        .update({
          data: {
            status: 'completed',
            updateTime: new Date()
          }
        })

      wx.showToast({
        title: '标记成功',
        icon: 'success'
      })

      this.loadFoodList()
    } catch (err) {
      console.error('标记失败', err)
    }
  },

  // 长按进入选择模式
  onLongPress(e) {
    if (this.data.isSelectMode) return
    
    const { id } = e.currentTarget.dataset
    this.setData({
      isSelectMode: true,
      [`foodList[${this.getFoodIndex(id)}].checked`]: true,
      selectedCount: 1
    })
  },

  // 取消选择模式
  cancelSelect() {
    const { foodList } = this.data
    foodList.forEach(item => item.checked = false)
    
    this.setData({
      isSelectMode: false,
      foodList,
      selectedCount: 0
    })
  },

  // 单个删除
  async onDeleteSingle(e) {
    const { id } = e.currentTarget.dataset
    
    wx.showModal({
      title: '确认删除',
      content: '是否删除该商品？',
      success: async (res) => {
        if (res.confirm) {
          const db = wx.cloud.database()
          try {
            await db.collection('food_reminders')
              .doc(id)
              .remove()

            wx.showToast({
              title: '删除成功',
              icon: 'success'
            })

            this.loadFoodList()
          } catch (err) {
            console.error('删除失败', err)
          }
        }
      }
    })
  },

  // 获取食品索引
  getFoodIndex(id) {
    return this.data.foodList.findIndex(item => item._id === id)
  },

  // 检查过期状态
  async checkExpired() {
    try {
      const { result } = await wx.cloud.callFunction({
        name: 'checkExpired'
      })

      if (result.hasExpired) {
        this.loadFoodList() // 重新加载列表
      }
    } catch (err) {
      console.error('检查过期状态失败', err)
    }
  }
})